package compare

// CompareMaps 使用泛型对比两个 map[K]V 类型的参数 A 和 B
// - K: map 的键，必须是可比较的类型
// - V: map 的值，必须是可比较的类型
// 返回三个切片：OnlyA、OnlyB 和 Unequal
// - OnlyA: 仅在 A 中存在的键
// - OnlyB: 仅在 B 中存在的键
// - Unequal: 两边都存在，但值不相等的键
func CompareMaps[K Comparable, V Comparable](A, B map[K]V) (OnlyA, OnlyB, Unequal []K) {
	// 遍历 A，找出 OnlyA 和 Unequal
	for key, value := range A {
		if valInB, existsInB := B[key]; existsInB {
			// 如果键同时存在于 A 和 B，但值不相等，则加入 Unequal
			if value != valInB {
				Unequal = append(Unequal, key)
			}
		} else {
			// 如果键仅存在于 A 中，则加入 OnlyA
			OnlyA = append(OnlyA, key)
		}
	}

	// 遍历 B，找出 OnlyB
	for key := range B {
		if _, existsInA := A[key]; !existsInA {
			// 如果键仅存在于 B 中，则加入 OnlyB
			OnlyB = append(OnlyB, key)
		}
	}

	return OnlyA, OnlyB, Unequal
}
